// 必须首先加载 polyfills，在任何其他模块之前
import './polyfills';

// 注册 TypeScript 支持（开发环境）
if (process.env.NODE_ENV !== 'production') {
  try {
    require('ts-node/register');
  } catch (e) {
    // ts-node 未安装时忽略错误
    console.warn('ts-node not found, TypeScript files may not work');
  }
}

import { app, BrowserWindow, ipcMain } from 'electron';
import { promises as fs } from 'fs';
import path from 'path';
import isDev from 'electron-is-dev';
import IPCHandlers from './ipc/ipcHandlers';

class ElectronApp {
  private mainWindow: BrowserWindow | null = null;
  private ipcHandlers: IPCHandlers | null = null;

  constructor() {
    this.initApp();
  }

  private initApp(): void {
    // 禁用GPU加速以解决Windows上的渲染问题
    app.disableHardwareAcceleration();

    // 完全禁用协议处理器功能，避免Windows弹窗
    if (process.platform === 'win32') {
      // 阻止应用注册为协议处理器
      app.removeAsDefaultProtocolClient('bytedance');
      app.removeAsDefaultProtocolClient('douyin');
      app.removeAsDefaultProtocolClient('douhu');
    }

    // 当 Electron 完成初始化时触发
    app.whenReady().then(() => {
      this.createMainWindow();
      this.initIPC();

      app.on('activate', () => {
        // macOS 上当应用被激活时重新创建窗口
        if (BrowserWindow.getAllWindows().length === 0) {
          this.createMainWindow();
        }
      });
    });

    // 当所有窗口都关闭时退出应用（除了 macOS）
    app.on('window-all-closed', () => {
      if (process.platform !== 'darwin') {
        app.quit();
      }
    });

    // 应用退出前的清理工作
    app.on('before-quit', (event) => {
      if (this.ipcHandlers) {
        // 通知 IPC 处理器进行清理
        ipcMain.emit('app-quit');
      }
    });
  }

  private createMainWindow(): void {
    // 创建主窗口
    this.mainWindow = new BrowserWindow({
      width: 1400,
      height: 900,
      minWidth: 1200,
      minHeight: 800,
      show: false, // 初始隐藏窗口，准备好后再显示
      title: '抖乎-主页管理',
      autoHideMenuBar: true, // 隐藏菜单栏
      titleBarStyle: 'default',
      webPreferences: {
        nodeIntegration: false,
        contextIsolation: true,
        webSecurity: true,
        preload: path.join(__dirname, 'preload.js')
      }
    });

    // 加载应用
    const startUrl = isDev
      ? 'http://localhost:3010'
      : `file://${path.join(__dirname, '../ui/build/index.html')}`;

    this.mainWindow.loadURL(startUrl);

    // 窗口准备好后显示
    this.mainWindow.once('ready-to-show', () => {
      if (this.mainWindow) {
        this.mainWindow.show();

        // 开发环境下打开开发者工具
        if (isDev) {
          this.mainWindow.webContents.openDevTools();
        }
      }
    });

    // 窗口关闭事件
    this.mainWindow.on('closed', () => {
      this.mainWindow = null;
    });

    // 防止新窗口弹出
    this.mainWindow.webContents.setWindowOpenHandler(({ url }) => {
      // 在默认浏览器中打开链接
      require('electron').shell.openExternal(url);
      return { action: 'deny' };
    });

    // 阻止所有导航请求弹出协议处理器对话框
    this.mainWindow.webContents.on('will-navigate', (event, navigationUrl) => {
      const parsedUrl = new URL(navigationUrl);

      // 如果是协议链接，阻止导航并在外部打开
      if (parsedUrl.protocol !== 'http:' && parsedUrl.protocol !== 'https:' && parsedUrl.protocol !== 'file:') {
        event.preventDefault();
        require('electron').shell.openExternal(navigationUrl);
      }
    });

    // 阻止新窗口创建
    this.mainWindow.webContents.setWindowOpenHandler(({ url }) => {
      require('electron').shell.openExternal(url);
      return { action: 'deny' };
    });

    // 处理页面加载错误
    this.mainWindow.webContents.on('did-fail-load', (event, errorCode, errorDescription, validatedURL) => {
      console.error('页面加载失败:', errorCode, errorDescription, validatedURL);

      // 如果是开发环境且连接失败，显示等待页面
      if (isDev && errorCode === -102) {
        this.showWaitingPage();
      }
    });
  }

  private showWaitingPage(): void {
    if (!this.mainWindow) return;

    const waitingHtml = `
      <!DOCTYPE html>
      <html>
      <head>
          <title>等待开发服务器</title>
          <style>
              body {
                  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
                  display: flex;
                  justify-content: center;
                  align-items: center;
                  height: 100vh;
                  margin: 0;
                  background-color: #f5f5f5;
              }
              .container {
                  text-align: center;
                  padding: 40px;
                  background: white;
                  border-radius: 8px;
                  box-shadow: 0 2px 10px rgba(0,0,0,0.1);
              }
              .spinner {
                  border: 3px solid #f3f3f3;
                  border-top: 3px solid #1890ff;
                  border-radius: 50%;
                  width: 40px;
                  height: 40px;
                  animation: spin 1s linear infinite;
                  margin: 0 auto 20px;
              }
              @keyframes spin {
                  0% { transform: rotate(0deg); }
                  100% { transform: rotate(360deg); }
              }
          </style>
      </head>
      <body>
          <div class="container">
              <div class="spinner"></div>
              <h2>等待开发服务器启动...</h2>
              <p>请确保运行了 <code>npm run dev</code></p>
              <button onclick="location.reload()">重新加载</button>
          </div>
          <script>
              // 每5秒自动重新加载
              setTimeout(() => location.reload(), 5000);
          </script>
      </body>
      </html>
    `;

    this.mainWindow.loadURL(`data:text/html;charset=UTF-8,${encodeURIComponent(waitingHtml)}`);
  }

  private initIPC(): void {
    // 初始化 IPC 处理器
    this.ipcHandlers = new IPCHandlers();

    // 添加一些应用级别的 IPC 处理器
    ipcMain.handle('app-version', () => {
      return app.getVersion();
    });

    ipcMain.handle('app-name', () => {
      return app.getName();
    });

    ipcMain.handle('get-app-path', (event, name) => {
      return app.getPath(name);
    });

    // 窗口控制
    ipcMain.handle('window-minimize', () => {
      if (this.mainWindow) {
        this.mainWindow.minimize();
      }
    });

    ipcMain.handle('window-maximize', () => {
      if (this.mainWindow) {
        if (this.mainWindow.isMaximized()) {
          this.mainWindow.restore();
        } else {
          this.mainWindow.maximize();
        }
      }
    });

    ipcMain.handle('window-close', () => {
      if (this.mainWindow) {
        this.mainWindow.close();
      }
    });

    ipcMain.handle('set-window-title', (event, title) => {
      if (this.mainWindow) {
        this.mainWindow.setTitle(title);
      }
    });

    // 开发者工具
    ipcMain.handle('toggle-dev-tools', () => {
      if (this.mainWindow) {
        this.mainWindow.webContents.toggleDevTools();
      }
    });
  }

  // 获取主窗口实例（供爬取器使用）
  public getMainWindow(): BrowserWindow | null {
    return this.mainWindow;
  }
}

// 创建应用实例
const electronApp = new ElectronApp();

// 导出应用实例供其他模块使用
export default electronApp;